package optional;

import org.junit.Test;

import java.util.Optional;
import java.util.OptionalInt;

/**
 * @author lilingzhi
 * @since 2022/12/30 9:18
 */
public class OptionalDemo {

    @Test
    public void test(){
        Car car = null;
        // 声明一个空optional对象
        Optional<Car> empty = Optional.empty();
        // 创建一个非空值得optional对象,如果对象为空值,则nullPointException
//        Optional<Car> car2 = Optional.of(car);
        // 创建一个可以接受Optional对象
        Optional<Car> car1 = Optional.ofNullable(car);


    }


    @Test
    public void test2(){
        //无法通过编译
        Person person = new Person();
//        Optional<Person> optionalPerson = Optional.of(person);
//        optionalPerson.map(Person::getCar)
//                .map(Car::getInsurance)
//                .map(Insurance::getName);
        Optional<Person>optionalPerson = Optional.of(person);
        String unknown = optionalPerson.flatMap(Person::getCar)
                .flatMap(Car::getInsurance)
                .map(Insurance::getName)
                .orElse("Unknown");
        System.out.println(unknown);

        Person person1 = new Person();
    }


    @Test
    public void test3(){
        Optional<Object> empty = Optional. empty();
//         noSuchElementException
        Object o = empty.get();
        // 如果value 为空 提供默认值
        Object other = empty.orElse("other");

        // 如果有值则执行操作,没有则不执行
        empty.ifPresent(System.out::println);

        // 如果value 为空 ,则可以希望抛出指定异常
        empty.orElseThrow(RuntimeException::new);

        // optional 对象不包含value值,则执行
        Object o1 = empty.orElseGet(Object::new);
        System.out.println(o1);
    }
}


class Person {
    private final Optional<Car> car = Optional.empty(); // ←─人可能有车，也可能没有车，因此将这个字段声明为Optional
    public Optional<Car> getCar() { return car; }
}
class Car {
    private final Optional<Insurance> insurance = Optional.empty();// ←─车可能进行了保险，也可能没有保险，所以将这个字段声明为Optional
    public Optional<Insurance> getInsurance() { return insurance; }
}
class Insurance {
    private String name;// ←─保险公司必须有名字
    public String getName() { return name; }
}
